都是Nginx前缀惹的祸,FastDFS不能访问了!!
点击上方蓝色“冰河技术”,关注并选择“设为星标”
持之以恒,贵在坚持,每天进步一点点!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
https://github.com/sunshinelyz/mykit-delay
PS: 欢迎各位Star源码,也可以pr你牛逼哄哄的代码。
写在前面
最近在服务器上搭建了一套FastDFS集群,节点为6个。统一对外提供文件的上传和访问服务。在实际开发过程中,前端童鞋需要访问其他服务器来转发对FastDFS服务的访问,此时,前端访问FastDFS服务时多加了一个前缀,导致FastDFS服务返回400状态码。那么,我们该如何解决呢?
文章已收录到:https://gitee.com/binghe001/technology-binghe 和 https://github.com/sunshinelyz/technology-binghe 小伙伴们别忘记给我 Star 呦!!
问题重现
在服务器上搭建集群时,统一对外访问的接口为http://192.168.175.110,前端童鞋访问时,是通过http://192.168.175.101访问的,并且前端加了一个前缀file,也就是通过http://192.168.175.101/file来访问的。第一时间我想到的是直接将前端的请求通过Nginx转发到192.168.175.110服务器。在192.168.175.101服务器上简化后的Nginx配置如下所示。
upstream file {
server 192.168.175.110:80 max_fails=3;
}
server {
listen 80;
server_name 192.168.175.101;
location / {
root html;
index index.html index.htm;
#允许cros跨域访问
add_header 'Access-Control-Allow-Origin' '*';
#proxy_redirect default;
#跟代理服务器连接的超时时间,必须留意这个time out时间不能超过75秒,当一台服务器当掉时,过10秒转发到另外一台服务器。
proxy_connect_timeout 10;
}
location ~/file {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
proxy_pass http://file;
proxy_set_header Host $host:$server_port;
}
}
我在192.168.175.110服务器上配置的Ngin如下所示。
server {
listen 80;
server_name 192.168.175.110;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
#允许cros跨域访问
add_header 'Access-Control-Allow-Origin' '*';
#proxy_redirect default;
#跟代理服务器连接的超时时间,必须留意这个time out时间不能超过75秒,当一台服务器当掉时,过10秒转发到另外一台服务器。
proxy_connect_timeout 10;
}
location ~/group([0-9]){
root /data/fastdfs/storage/data;
ngx_fastdfs_module;
}
}
此时,就存在一个问题:通过file前缀将请求转发到192.168.175.110服务器时,会返回400状态码。
其实,问题的定位也比较简单,就是前端访问时多加了一个file前缀。那么,我们该如何解决这个问题呢?
问题解决
一般情况下,Nginx的反向代理,只会替换域名或者IP部分,其他部分会按照原样进行转发。也就是说,前端访问http://192.168.175.101/file时,会被转发到http://192.168.175.110/file上,从而无法正常访问文件服务接口。
既然定位到问题了,那我们下一步就是要解决这个问题。思路也比较简单,就是在192.168.175.101服务器上接收到请求时将file前缀去掉。那如何去掉呢?
其实也很简单,只需要在192.168.175.101服务器上的Nginx上添加如下配置。
location ^~/file/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://file/;
}
此时,192.168.175.101服务器上的Nginx配置如下所示。
upstream file {
server 192.168.175.110:80 max_fails=3;
}
server {
listen 80;
server_name 192.168.175.101;
location / {
root html;
index index.html index.htm;
#允许cros跨域访问
add_header 'Access-Control-Allow-Origin' '*';
#proxy_redirect default;
#跟代理服务器连接的超时时间,必须留意这个time out时间不能超过75秒,当一台服务器当掉时,过10秒转发到另外一台服务器。
proxy_connect_timeout 10;
}
location ^~/file/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://file/;
}
}
此时,再次访问http://192.168.175.101/file时,就被转发到http://192.168.175.110上,能够正确访问文件服务接口。
知识扩展
nginx反向代理配置如何去除前缀?
使用Nginx做反向代理的时候,可以简单的直接把请求原封不动的转发给下一个服务。设置proxy_pass请求只会替换域名,如果要根据不同的url后缀来访问不同的服务,则需要通过如下方法:
方法一:加"/"
upstream pay {
server localhost:8089 weight=5;
}
upstream order {
server localhost:8090 weight=5;
}
server {
listen 80;
server_name binghe.com;
location ^~/pay/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://pay/;
}
location ^~/order/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://order/;
}
}
^~/pay/
表示匹配前缀是pay的请求,proxy_pass
的结尾有/
, 则会把/pay/*
后面的路径直接拼接到后面,即移除pay。
方法二:rewrite
upstream pay {
server localhost:8089 weight=5;
}
upstream order {
server localhost:8090 weight=5;
}
server {
listen 80;
server_name binghe.com;
location ^~/pay/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
rewrite ^/user/(.*)$ /$1 break;
proxy_pass http://pay;
}
location ^~/order/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
rewrite ^/order/(.*)$ /$1 break;
proxy_pass http://order;
}
}
冰河原创PDF
关注 冰河技术 微信公众号:
回复 “并发编程” 领取《深入理解高并发编程(第1版)》PDF文档。
回复 “并发源码” 领取《并发编程核心知识(源码分析篇 第1版)》PDF文档。
回复 ”限流“ 领取《亿级流量下的分布式解决方案》PDF文档。
回复 “设计模式” 领取《深入浅出Java23种设计模式》PDF文档。
回复 “Java8新特性” 领取 《Java8新特性教程》PDF文档。
回复 “分布式存储” 领取《跟冰河学习分布式存储技术》 PDF文档。
回复 “Nginx” 领取《跟冰河学习Nginx技术》PDF文档。
回复 “互联网工程” 领取《跟冰河学习互联网工程技术》PDF文档。
重磅福利
微信搜一搜【冰河技术】微信公众号,关注这个有深度的程序员,每天阅读超硬核技术干货,公众号内回复【PDF】有我准备的一线大厂面试资料和我原创的超硬核PDF技术文档,以及我为大家精心准备的多套简历模板(不断更新中),希望大家都能找到心仪的工作,学习是一条时而郁郁寡欢,时而开怀大笑的路,加油。如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。如果有幸我们江湖再见!
另外,我开源的各个PDF,后续我都会持续更新和维护,感谢大家长期以来对冰河的支持!!
写在最后
如果你觉得冰河写的还不错,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 冰河技术 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 冰河技术 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 冰河技术 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!